/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.commun.tosca;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.ListUtils;
import org.apache.commons.collections.Predicate;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

/**
 * @author Holmes Kelly
 */
public abstract class AbstractBcTestCase {

    /**
     * Creation d'un nouveau document JDOM a partir d'un fichier de donnees xml
     * 
     * @param fichier .
     * @return Document JDOM
     * @throws Exception .
     */
    protected Document getDocumentXML(String fichier) throws Exception {

        SAXBuilder sxb = new SAXBuilder();

        Document document = null;

        // On crée un nouveau document JDOM avec en argument le fichier XML
        // Le parsing est terminé ;)
        // document = sxb.build(new File(fichier));

        document = sxb.build(getClass().getResourceAsStream(fichier));

        return document;
    }

    /**
     * Recuperation de l'element racine du document JDOM
     * 
     * @param document .
     * @return Element racine
     */
    protected Element getElementRacineXML(Document document) {

        Element elementRacine = null;

        if (document != null) {

            elementRacine = document.getRootElement();
        }

        return elementRacine;
    }

    /**
     * Recuperation des elements enfants a partir d'un element racine provenant
     * d'un document JDOM
     * 
     * @param element .
     * @param name .
     * @return une liste d'elements enfants a partir d'un element racine
     */
    protected List< ? > getListElementByTagNameXML(Element element, String name) {

        return element == null ? ListUtils.EMPTY_LIST : element.getChildren(name);

    }

    /**
     * Recuperation d'un element d'une liste a partir du couple
     * attribut(id,valeur)
     * 
     * @param elements .
     * @param attribute .
     * @param attributeValue .
     * @return un element par son attribut(id,valeur)
     */
    protected Element getElementByAttributFromList(List< ? > elements, String attribute, String attributeValue) {

        final String attributeXml = attribute;

        final String attributeValueXml = attributeValue;

        Predicate predicate = new Predicate() {

            public boolean evaluate(Object object) {

                Element element = (Element ) object;

                return element.getAttributeValue(attributeXml).equals(attributeValueXml);
            }
        };

        return (Element ) CollectionUtils.find(elements, predicate);

    }

    /**
     * Recuperation d'un element enfant a partir d'un document JDOM, nameTag de
     * l'element et son couple attribut (id,valeur)
     * 
     * @param ressourceName .
     * @param elementTagName .
     * @param attributName .
     * @param attributValue .
     * @return un element enfant par son couple attribut (id,valeur)
     * @throws Exception .
     */
    protected Element extractElementChildByAttribut(String ressourceName, String elementTagName, String attributName,
                    String attributValue) throws Exception {

        Document document = getDocumentXML(ressourceName);

        Element elementRacineXML = getElementRacineXML(document);

        List< ? > listElementChild = getListElementByTagNameXML(elementRacineXML, elementTagName);

        Element elementChild = getElementByAttributFromList(listElementChild, attributName, attributValue);

        return elementChild;
    }

    /**
     * Recuperation d'une map<tagname,attribut>
     * 
     * @param element .
     * @param attributeName .
     * @return map des noeuds relative a un element enfant
     */
    protected Map<String, String> getMapElementChildren(Element element, String attributeName) {

        Map<String, String> mapInfos = new HashMap<String, String>();

        List< ? > listElementChildren = element.getChildren();

        if (listElementChildren != null && !listElementChildren.isEmpty()) {

            for (Object object : listElementChildren) {

                Element elementChild = (Element ) object;

                String key = elementChild.getName();

                String value = elementChild.getAttributeValue(attributeName);

                mapInfos.put(key, value);
            }
        }

        return mapInfos;

    }

}
